// utils/request.js
const config = require('./config.js');

function request(options) {
  // 默认需要验证 token
  const { requireAuth = true } = options; 
  // 如果需要 token 验证，并且本地没有 token，
  //则跳转到登录页面
  if (requireAuth) {
    const token = wx.getStorageSync('token');
    if (!token) {
      wx.redirectTo({
        url: '/pages/login/login'
      });
      return; // 提前 return，避免后续执行
    }
  }

  return new Promise((resolve, reject) => {
    wx.request({
      ...options,
      url: `${config.baseUrl}${options.url}`,
      header: {
        'Authorization': requireAuth ? wx.getStorageSync('token') : '', // 根据是否需要 token 设置 header
        ...options.header
      },
      success(res) {
        const code = res.data.code;
        if (res.statusCode === 401 
          || code === 401 
          || code === 501) {
          wx.removeStorageSync('token');
          wx.redirectTo({
            url: '/pages/login/login'
          });
          reject(new Error('未授权，请重新登录'));
        } else {
          resolve(res); // 成功时 resolve
        }
      },
      fail(err) {
        reject(err); // 请求失败时 reject
      }
    });
  });
}

// 假设您在登录时从后端获取到 token
function onLoginSuccess(token,expiresIn) {
  const currentTime = new Date().getTime(); // 当前时间（毫秒）
  const expirationTime = currentTime + expiresIn * 1000; // 过期时间，假设 expiresIn 是秒

  // 存储 token 和到期时间
  wx.setStorageSync('token', token);
  wx.setStorageSync('token_expiration', expirationTime);

  // 设置定时刷新 token
  scheduleTokenRefresh(expiresIn);
}

function scheduleTokenRefresh(expiresIn) {
  // 让定时器在 token 到期前几分钟（比如5分钟）触发
  const refreshTime = (expiresIn - 300) * 1000; // 提前 5 分钟刷新，单位毫秒

  setTimeout(() => {
    refreshToken();
  }, refreshTime);
}

function refreshToken() {
  const token = wx.getStorageSync('token');
  if (token) {
    // 请求后端刷新 token 的接口
    request({
      url: '/wx/refresh-token',
      method: 'GET'
    }).then(response => {
      const newToken = response.data.data.token;
      const expiresIn = response.data.data.token;
      if (newToken) {
        // 成功获取新 token，更新存储
        onLoginSuccess(newToken, expiresIn);
      } else {
        wx.showToast({
          title: '网络错误，请稍后重试',
          icon: 'none'
        });
      }
    }).catch(error => {
      wx.showToast({
        title: '网络错误，请稍后重试',
        icon: 'none'
      });
      console.error('请求错误：', error);
    });
  }
}

module.exports = {
  request,
  onLoginSuccess,
  scheduleTokenRefresh,
  refreshToken
};